home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / cad_elec / gerbtool.exe / DATA.1 / DEMO.MAC < prev    next >
Text File  |  1995-10-23  |  14KB  |  764 lines

  1. # To have GerbTool automatically run a macro at startup time
  2. # name the macro STARTUP.
  3. #
  4. #MACRO startup
  5. #
  6. # your stuf here...
  7. #
  8. #END
  9.  
  10.  
  11. MACRO BestDrill
  12.  
  13. # This macro calculates an optimal drill file.  It accepst a starting
  14. # and ending value for the swath and a step value.  It then determines
  15. # which swath width in this range gives the shortest drill travel and
  16. # produces a drill file using these settings.
  17.  
  18.     Set $mindist = 999999.9         # just a big number
  19.     Set $minsort = 1             # 0 = no sort, 1 = X sort, 2 = Y sort.
  20.     Set $sswath  = 0.01            # start swath default
  21.     Set $eswath  = 0.1            # end swath default
  22.     Set $step    = 0.01            # swath step default
  23.     Set $layer   = $$ACTIVELAYER        # drill layer default
  24.  
  25.     # get paramaters from the user.
  26.     GetValue        "Enter drill layer:",$layer
  27.     GetValue        "Enter start swath:",$sswath
  28.     GetValue        "Enter ending swath:",$eswath
  29.     GetValue        "Enter step size:",$step
  30.  
  31.     Set $swath = $sswath                # save initial value
  32.  
  33.     DRILL            # Start of the drill command
  34.  
  35.         # could send output files to a RAM drive for speed.
  36.         OutFile        "drill.out"
  37.         RepFile        "drill.rep"
  38.  
  39.         Sort            1                 # X sort
  40.         Layer            $layer
  41.         WindowMode    $$NO
  42.  
  43.         REPEAT $swath <= $eswath        # control loop 
  44.  
  45.             Swath            $swath            # set swath with for this drill run
  46.  
  47.             GO                        # perform the drill with the paramaters supplied.
  48.  
  49.             Set $curdist = $$DRILLTRAVEL
  50.             IF $curdist < $mindist            # see if this run is the best so far
  51.                 Set $mindist = $curdist        # save values if it is
  52.                 Set $smallswath = $sswath
  53.             END
  54.  
  55.             Calc    $swath = $swath + $step        # calculate the next swath width
  56.         END        # end of repeat
  57.  
  58.         Set $swath = $sswath        # restore swath width for y sort attempts
  59.  
  60.         Sort            2        # Y sort
  61.         REPEAT $swath <= $eswath        # same as the above loop
  62.  
  63.             Swath            $swath
  64.  
  65.             GO                
  66.  
  67.             Set $curdist = $$DRILLTRAVEL
  68.             IF $curdist < $mindist
  69.                 Set $mindist = $curdist
  70.                 Set $smallswath = $sswath
  71.                 Set $minsort = 2
  72.             END
  73.  
  74.             Calc    $swath = $swath + $step
  75.         END
  76.  
  77.         # Set the paramaters to the best found and produce a final drill file.
  78.         Swath            $smallswath
  79.         Sort            $minsort
  80.         OutFile        "drill.out"
  81.         RepFile        "drill.rep"
  82.         GO
  83.  
  84.         # report to the user
  85.         GetValue "total dist:",$$DRILLTRAVEL
  86.         GetValue "best swath:", $smallswath
  87.  
  88.     END        # of drill function.
  89. END             # of macro
  90.  
  91.  
  92. MACRO Step-N-Repeat
  93.  
  94. # This macro performs a step and repeat of windowed objects
  95.  
  96.  
  97.     COPY
  98.  
  99.         By                $$WINDOWMODE
  100.         Boundary     $$YES
  101.         Flashes        $$YES
  102.         Draws            $$YES
  103.         Arcs            $$YES
  104.         Layer            0
  105.         Dcode            0
  106.  
  107. # Get user parameters
  108.         GetValue        "Enter number of copies:",$copies
  109.         GetWindow    "Enter Copy Window",$lx,$ly,$ux,$uy
  110.         GetPoint        "Enter from location", $fx,$fy
  111.         GetPoint        "Enter to location", $tx,$ty
  112.  
  113.         # Calculate the offsets
  114.         Calc $dx = $tx - $fx
  115.         Calc $dy = $ty - $fy
  116.  
  117.         REPEAT $copies > 0
  118.             GO                $lx,$ly,$ux,$uy,  $fx,$fy, $tx, $ty     # do the copy
  119.  
  120.             Calc $tx = $tx + $dx                # add in the offsets
  121.             Calc $ty = $ty + $dy
  122.  
  123.             Calc $copies = $copies - 1        # decrement the counter
  124.  
  125.             IF $$STATUS == 0    # nothing was copied.  Stop processing
  126.                 STOP        "copy failed..."
  127.             END                    # end of if
  128.         END                        # end of if
  129.     END                            # end of copy
  130. END                                # end of macro
  131.  
  132.  
  133.  
  134. MACRO FillAround
  135.  
  136. # This macro calculates the extent of the layers and places a box around this
  137. # extent filled with cross hatching, on the active layer.
  138.  
  139.     Set $layer = 1                 # counter
  140.  
  141.     # initialize the variables.
  142.     Set $minx = 999999.0
  143.     Set $miny = 999999.0
  144.     Set $maxx = -999999.0
  145.     Set $maxy = -999999.0
  146.  
  147.     # loop through all the layers to find the largest extent
  148.     REPEAT $layer <= $$MAXLAYERS
  149.         GETEXTENTS $layer, $lx, $ly, $ux, $uy
  150.  
  151.         IF $lx < $minx
  152.             Set $minx = $lx
  153.         END
  154.         IF $ly < $miny
  155.             Set $miny = $ly
  156.         END
  157.         IF $ux > $maxx
  158.             Set $maxx = $ux
  159.         END
  160.         IF $uy > $maxy
  161.             Set $maxy = $uy
  162.         END
  163.  
  164.         Calc $layer = $layer + 1 # increment loop control
  165.  
  166.     END # of repeat
  167.  
  168.     # calculate the size of the inner rectangle, make 0.5 inches larger than
  169.     # the extent
  170.     Calc $iminx = $minx - 0.5
  171.     Calc $iminy = $miny - 0.5
  172.     Calc $imaxx = $maxx + 0.5
  173.     Calc $imaxy = $maxy + 0.5
  174.  
  175.     # calculate the size of the outer rectangle, make 3.0 inches larger than
  176.     # the extent
  177.     Calc $ominx = $minx - 3.0
  178.     Calc $ominy = $miny - 3.0
  179.     Calc $omaxx = $maxx + 3.0
  180.     Calc $omaxy = $maxy + 3.0
  181.  
  182.     POUR
  183.         DrawClr        0.02
  184.         FLashClr        0.02
  185.         MinArea        0.00
  186.  
  187.         Type            2            # 0 == OUTLINE, 1 == SOLID, 2 == HATCHED
  188.  
  189.         HatchLine    1, $$CURRENTDCODE, 0.35, 45    # current Dcode, 0.35 inch spacing, 45 deg 
  190.         HatchLine    2, $$CURRENTDCODE, 0.35, 135    # current Dcode, 0.35 inch spacing, 135 deg 
  191.         HatchLine    3, 0, 0.0, 0         # only use 2 lines
  192.  
  193.         DCODE $$CURRENTDCODE                                # used for outlines
  194.  
  195.         # perform the pour.  The coordinates given represent a double rectangle
  196.         # about the extent of the data.  These rectangles are joined in the lower
  197.         # left corner by a double set of lines.  This enables the fill to work on
  198.         # just the area between the two rectangles and not attempt to fill any
  199.         # areas in the actual gerber area.
  200.  
  201.         GO $ominx,$ominy, $ominx,$omaxy, $omaxx,$omaxy, $omaxx,$ominy, $imaxx,$iminy, $imaxx,$imaxy, $iminx,$imaxy, $iminx,$iminy, $imaxx,$iminy, $omaxx,$ominy, $ominx,$ominy
  202.     END    # of pour
  203. END        # end of macro
  204.  
  205.  
  206.  
  207. MACRO FlashToDraw
  208.  
  209. #
  210. # This Macro will convert all RECTANGULAR flashes into drawn pads using
  211. # the Poly Fill command.
  212. #
  213.  
  214. # request a dcode to begin the fills with
  215.  
  216.     REPEAT    $$STATUS == 0
  217.  
  218.         GetValue            "Enter valid Fill Dcode:", $dc
  219.         CurrentDcode    $dc
  220.  
  221.     END
  222.  
  223. # restrict the search to the active layer
  224.  
  225.     SELECTCRITERIA
  226.  
  227.         Layer $$ACTIVELAYER
  228.  
  229.     END
  230.  
  231. # now loop thru active layer looking for rectangular flashes
  232.  
  233.     GetFirstItem    $layer, $seqno, $net, $dcode, $type, $x, $y, $x2, $y2, $dia, $cw
  234.  
  235.     REPEAT    $$STATUS
  236.  
  237.         IF    $type == $$FLASH
  238.  
  239.             GetApInfo      $layer, $dcode, $shp, $xs, $ys, $type, $tool, $toolsize, $legend
  240.  
  241.             Calc    $wby2 = $xs / 2
  242.             Calc    $hby2 = $ys / 2
  243.  
  244.             IF $shp == $$RECTANGLE
  245.  
  246.                 # calculate pad extremes, add fill and delete old flash
  247.  
  248.                 Calc    $lx = $x - $wby2
  249.                 Calc    $ly = $y - $hby2
  250.                 Calc    $ux = $x + $wby2
  251.                 Calc    $uy = $y + $hby2
  252.  
  253.                 AddFill            $lx,$ly, $lx,$uy, $ux,$uy, $ux,$ly, $lx,$ly
  254.  
  255.                 DeleteItem    $layer, $seqno
  256.  
  257.             END
  258.  
  259.         END
  260.  
  261.         GetNextItem
  262.  
  263.     END
  264.  
  265.     Redraw
  266.  
  267. END
  268.  
  269.  
  270. MACRO PadStack1
  271.  
  272.     Set     $layer = 1
  273.  
  274.     REPEAT    $$STATUS == 0
  275.  
  276.         GetValue      "Enter valid Dcode:",$dc
  277.         CurrentDcode    $dc
  278.  
  279.     END
  280.  
  281.     GetPoint  "Pad Stack",$lx,$ly
  282.  
  283.     REPEAT    $layer <= $$MAXLAYERS
  284.  
  285.         ActiveLayer        $layer
  286.  
  287.         IF $$STATUS
  288.  
  289.             AddFlash    $lx,$ly
  290.  
  291.         END
  292.  
  293.         Calc $layer = $layer + 1
  294.  
  295.     END
  296.  
  297. END
  298.  
  299. MACRO pnp
  300.  
  301. # This macro will locate the center of a windowed set of pads and
  302. # add a flash at that point. 
  303.  
  304.     GetString "Enter output filename:", $filename
  305.  
  306.     Strlen    $filename
  307.  
  308.     IF $$STATUS > 0
  309.  
  310.         FileOpen    $fd, $filename, "w"
  311.         Set        $writing = $$STATUS
  312.  
  313.     ELSE
  314.  
  315.         Set         $writing = $$FALSE
  316.     END
  317.  
  318.     Set $$STATUS = 0
  319.  
  320.     REPEAT    $$STATUS == 0
  321.  
  322.         GetValue    "Enter Existing EMPTY Scratch Layer:", $slayer
  323.         ActiveLayer    $slayer
  324.  
  325.     END
  326.  
  327.     Set $$STATUS = 0
  328.  
  329.     REPEAT    $$STATUS == 0
  330.  
  331.         GetValue       "Enter Input Layer:", $layer
  332.         ActiveLayer    $layer
  333.  
  334.     END
  335.  
  336.     Set $$STATUS = 0
  337.  
  338.     REPEAT    $$STATUS == 0
  339.  
  340.         GetValue       "Enter Centroid Marker Dcode:", $dc
  341.         CurrentDcode    $dc
  342.  
  343.     END
  344.  
  345. # the current dcode is now correctly set
  346.  
  347.     Set $$STATUS = 0
  348.  
  349.     REPEAT    $$STATUS == 0
  350.  
  351.         GetValue    "Enter Centroid Marker Layer:", $olayer
  352.         ActiveLayer        $olayer
  353.  
  354.     END
  355.  
  356. # the active layer is now correctly set
  357.  
  358.     SELECTGROUP
  359.  
  360.         # set the selection criteria outside of the main repeat loop
  361.  
  362.         By       $$WINDOWMODE
  363.         Flashes       $$TRUE
  364.         Draws       $$FALSE
  365.         Arcs       $$FALSE
  366.         Layer       $layer
  367.  
  368.     END
  369.  
  370.     REPEAT $$TRUE
  371.  
  372.         GetWindow "Enter Component Window", $lx,$ly, $ux,$uy
  373.  
  374.         SELECTGROUP
  375.  
  376.             MODE    0
  377.             GO
  378.  
  379.             MODE    1
  380.             GO      $lx,$ly,$ux,$uy
  381.  
  382.         END
  383.  
  384.         IF $$SELGRPCNT > 0
  385.  
  386.             COPY
  387.  
  388.                 By    $$GROUPMODE
  389.                 Tolayer    $slayer
  390.  
  391.                 GO    0,0, 0,0
  392.  
  393.             END
  394.  
  395.             Set    $minx = 100000.0
  396.             Set    $miny = 100000.0
  397.             Calc    $maxx = -100000.0
  398.             Calc    $maxy = -100000.0
  399.  
  400.             Set    $layer = $slayer    # restrict the select search to the scratch layer
  401.  
  402.             GetFirstItem    $layer, $seqno, $net, $dcode, $type, $x, $y, $x2, $y2, $dia, $cw
  403.  
  404.             REPEAT    $$STATUS
  405.  
  406.                 IF    $type == $$FLASH
  407.  
  408.                     IF $x < $minx
  409.  
  410.                         Set $minx = $x
  411.  
  412.                     END
  413.  
  414.                     IF $x > $maxx
  415.  
  416.                         Set $maxx = $x
  417.  
  418.                     END
  419.  
  420.                     IF $y < $miny
  421.  
  422.                         Set $miny = $y
  423.  
  424.                     END
  425.  
  426.                     IF $y > $maxy
  427.  
  428.                         Set $maxy = $y
  429.  
  430.                     END
  431.  
  432.                 END
  433.  
  434.                 DeleteItem    $layer, $seqno
  435.  
  436.                 GetNextItem
  437.  
  438.             END
  439.  
  440.             Calc    $d = $maxx - $minx
  441.             Calc    $d = $d / 2
  442.             Calc    $cx = $minx + $d
  443.  
  444.             Calc    $d = $maxy - $miny
  445.             Calc    $d = $d / 2
  446.             Calc    $cy = $miny + $d
  447.  
  448.             IF $writing
  449.  
  450.                 GetString    "Enter Ref Desg:", $ref
  451.                 GetString    "Enter Part No:", $pn
  452.  
  453.                 FileWrite    $fd, "X%2.3nY%2.3n REF:%s PN:%s", $cx, $cy, $ref, $pn
  454.  
  455.             END
  456.  
  457.             AddFlash    $cx,$cy
  458.  
  459.         END
  460.  
  461.     END
  462.  
  463.     IF $writing
  464.  
  465.         FileClose $fd
  466.  
  467.     END
  468. END
  469.  
  470.  
  471.  
  472. MACRO bplot
  473.  
  474. # This macro allows you to batch plot the visible layers
  475. # one layer at a time.
  476.  
  477. # Since each layers netid value is used to temporarily store the original
  478. # visibility of the layer we must warn the user that any possible netlist
  479. # info will be lost.
  480.  
  481.     GetYesNo  "This macro will erase any previous netlist info! Continue?",$yesno
  482.  
  483.     IF $yesno == $$NO
  484.         STOP
  485.     END
  486.  
  487.     SET $Layer = $$MAXLAYERS
  488.  
  489.     REPEAT $Layer > 0                 # turn off all layers
  490.  
  491.         ActiveLayer        $Layer        # returns bad status if layer doesn't exist
  492.  
  493.         IF $$STATUS
  494.  
  495.             GetLayer $Layer,$fn,$ln,$an,$vis,$fc,$dc,$type,$pol,$key,$ft,$lx,$ly,$ux,$uy,$netid
  496.  
  497.             LAYERN $Layer
  498.                 Netid        $vis    # save true visibility
  499.                 Visibility    0
  500.             END
  501.  
  502.         END
  503.         CALC $Layer = $Layer - 1
  504.     END
  505.  
  506.     REDRAW
  507.  
  508.     SET $Layer = $$MAXLAYERS
  509.  
  510.     REPEAT $Layer > 0
  511.  
  512.         ActiveLayer        $Layer
  513.  
  514.         IF $$STATUS
  515.  
  516.             GetLayer $Layer,$fn,$ln,$an,$vis,$fc,$dc,$type,$pol,$key,$ft,$lx,$ly,$ux,$uy,$netid
  517.  
  518.             IF $netid > 0        # it was visible
  519.  
  520.                 LAYERN $Layer
  521.                     Visibility    1
  522.                 END
  523.  
  524.                 REDRAW
  525.  
  526.                 PLOTHPGL
  527.                     OUTFILE "LPT1"    # change this to suit your needs...
  528.                     SCALE 1.0
  529.                     GO 0, 0, 0, 0
  530.                 END
  531.  
  532.                 LAYERN $Layer
  533.                     Visibility    0
  534.                 END
  535.  
  536.             END
  537.  
  538.         END
  539.         
  540.         CALC $Layer = $Layer - 1
  541.  
  542.     END
  543.  
  544.     SET $Layer = $$MAXLAYERS
  545.  
  546.     REPEAT $Layer > 0                 # turn off all layers
  547.  
  548.         ActiveLayer        $Layer        # returns bad status if layer doesn't exist
  549.  
  550.         IF $$STATUS
  551.  
  552.             GetLayer $Layer,$fn,$ln,$an,$vis,$fc,$dc,$type,$pol,$key,$ft,$lx,$ly,$ux,$uy,$netid
  553.  
  554.             IF $netid > 0        # it was visible
  555.  
  556.                 LAYERN $Layer
  557.                     Visibility    $netid    # restore visibility
  558.                     Netid        0
  559.                 END
  560.  
  561.             END
  562.  
  563.         END
  564.  
  565.         CALC $Layer = $Layer - 1
  566.     END
  567.  
  568.     REDRAW
  569.  
  570. END
  571.  
  572.  
  573. MACRO AlignFlashes
  574.  
  575. # This macro will align flashes on all layers to a golden layer.
  576. # Each flash will be aligned on an individual basis.
  577.  
  578.     REPEAT    $$STATUS == 0
  579.         GetValue    "Enter layer to snap to:", $goldLayer
  580.         ACTIVELAYER $goldLayer         # validate layer
  581.     END
  582.     
  583.     SET $testLayer = 1
  584.  
  585.     SELECTCRITERIA
  586.         BY     $$ITEMMODE
  587.         TOLAYER    0
  588.         FLASHES $$YES
  589.         DRAWS     $$NO
  590.         ARCS     $$NO
  591.     END
  592.  
  593.     REPEAT $testLayer < $$MAXLAYERS
  594.     
  595.         ACTIVELAYER $testLayer
  596.  
  597.         IF $$STATUS != 0            # valid layer ?
  598.  
  599.             IF $testLayer != $goldLayer    # don't use the snap to layer
  600.  
  601.                 GETFIRSTITEM $goldLayer, $seqno, $net, $dcode, $type, $x, $y, $x2, $y2, $dia, $cw
  602.  
  603.                 REPEAT    $$STATUS != 0
  604.  
  605.                     IF $type == $$FLASH
  606.  
  607.                         # move the corresponding flash...
  608.  
  609.                         MOVE
  610.                             LAYER $testLayer
  611.                             GO $x, $y, $x, $y
  612.                         END
  613.  
  614.                     END
  615.  
  616.                     SELECTCRITERIA
  617.                         # must reset select layer as
  618.                         # GETNEXTITEM depends on it
  619.                         # and MOVE changes it...
  620.  
  621.                         LAYER    $goldLayer
  622.  
  623.                     END
  624.  
  625.                     GETNEXTITEM
  626.  
  627.                 END
  628.  
  629.             END
  630.  
  631.         END
  632.  
  633.         CALC $testLayer = $testLayer + 1
  634.  
  635.     END
  636.  
  637. END
  638.  
  639.  
  640. MACRO LaserFitToPage
  641.  
  642. # This macro calculates the maximum scale to fit the current design to a single
  643. # page, for HP LaserJet output, and then produces the output.
  644.  
  645.     Set $layer = 1                 # counter
  646.  
  647.     # initialize the variables.
  648.     Set $minx = 999999.0
  649.     Set $miny = 999999.0
  650.     Set $maxx = -999999.0
  651.     Set $maxy = -999999.0
  652.  
  653.     Set $mediax = 8.0
  654.     Set $mediay = 10.5
  655.  
  656.     # loop through all the layers to find the largest extent
  657.     REPEAT $layer <= $$MAXLAYERS
  658.         GETEXTENTS $layer, $lx, $ly, $ux, $uy
  659.  
  660.         IF $lx < $minx
  661.             Set $minx = $lx
  662.         END
  663.         IF $ly < $miny
  664.             Set $miny = $ly
  665.         END
  666.         IF $ux > $maxx
  667.             Set $maxx = $ux
  668.         END
  669.         IF $uy > $maxy
  670.             Set $maxy = $uy
  671.         END
  672.  
  673.         Calc $layer = $layer + 1 # increment loop control
  674.  
  675.     END # of repeat
  676.  
  677.     # calculate the boards size.
  678.     Calc $xsize = $maxx - $minx 
  679.     Calc $ysize = $maxy - $miny 
  680.  
  681.     # and determine the maximum scales for each direction.
  682.     Calc $xscale = $mediax / $xsize 
  683.     Calc $yscale = $mediay / $ysize 
  684.  
  685.     # use the smallest scale since the largest will not fit.
  686.     IF $xscale < $yscale
  687.         SET $fscale = $xscale
  688.     ELSE
  689.         SET $fscale = $yscale
  690.     END
  691.  
  692.     # LaserJet scaling rounds internaly to the nearest .001%.  Rounding up
  693.     # will make the plot too big to fit on the page, so subtract a little
  694.     # to prevent this.
  695.     Calc $fscale = $fscale - 0.0005 
  696.  
  697.     PLOTLJ
  698.         OUTFILE "lpt1"             # or output to a file
  699.         MEDIASIZE $mediax, $mediay
  700.         SCALE $fscale
  701.         OVERLAP 0.0
  702.         WINDOWMODE $$NO
  703.         GO $minx, $miny, $maxx, $maxy
  704.     END
  705.  
  706. END        # end of macro
  707.  
  708.  
  709. MACRO SetLayerColors
  710.  
  711. # This macro Sets the colors of layers 1 through 8 to user defined values.
  712. # Currently the best way to use this macro is to assign it to a function
  713. # key which is used after loading in a new design.
  714. #
  715. # If desired, other things can be done in each layer block such as setting the 
  716. # layer types or initial visibility.
  717.  
  718.     LAYERN 1
  719.         FLASHCOLOR "Blue"
  720.         DRAWCOLOR  "Blue"
  721.     END
  722.  
  723.     LAYERN 2
  724.         FLASHCOLOR "Green"
  725.         DRAWCOLOR  "Green"
  726.     END
  727.  
  728.     LAYERN 3
  729.         FLASHCOLOR "Cyan"
  730.         DRAWCOLOR  "Cyan"
  731.     END
  732.  
  733.     LAYERN 4
  734.         FLASHCOLOR "Red"
  735.         DRAWCOLOR  "Red"
  736.     END
  737.  
  738.     LAYERN 5
  739.         FLASHCOLOR "Yellow"
  740.         DRAWCOLOR  "Yellow"
  741.     END
  742.  
  743.     LAYERN 6
  744.         FLASHCOLOR "Magenta"
  745.         DRAWCOLOR  "Magenta"
  746.     END
  747.  
  748.     LAYERN 7
  749.         FLASHCOLOR "Brown"
  750.         DRAWCOLOR  "Brown"
  751.     END
  752.  
  753.     LAYERN 8
  754.         FLASHCOLOR "vga16Gray"
  755.         DRAWCOLOR  "vga16Gray"
  756.     END
  757.  
  758.     REDRAW
  759.  
  760. END        # end of macro
  761.  
  762.  
  763.  
  764.